from ete4 import Tree

# Loads a tree with branch lenght information. Note that if no
# distance info is provided in the newick, it will be initialized with
# the default dist value = 1.0
nw = """(((A:0.1, B:0.01):0.001, C:0.0001):1.0,
(((((D:0.00001,I:0):0,F:0):0,G:0):0,H:0):0,
E:0.000001):0.0000001):2.0;"""
t = Tree(nw)
print(t)
#   ╭─┬╴A
# ╭─┤ ╰╴B
# │ ╰╴C
# │       ╭─┬╴D
#─┤     ╭─┤ ╰╴I
# │   ╭─┤ ╰╴F
# │ ╭─┤ ╰╴G
# ╰─┤ ╰╴H
#   ╰╴E

# Calculate distance between two descendants of current node.
print('The distance between A and C is', t.get_distance('A', 'C'))

# Calculate the toplogical distance (number of nodes in between).
print('The number of nodes between A and D is',
      t.get_distance('A', 'D', topological=True))

# Calculate the farthest node from E within the whole structure.
farthest, dist = t['E'].get_farthest_node()
print('The farthest node from E is', farthest.name, 'with dist =', dist)

# Calculate the farthest node from E within the whole structure,
# using a topological distance (number of nodes in between).
# Note that the result is different.
farthest, dist = t['E'].get_farthest_node(topological=True)
print('The farthest (topologically) node from E is',
      farthest.name, 'with', dist, 'nodes in between')

# Calculate farthest node from an internal node.
farthest, dist = t.get_farthest_node()
print('The farthest node from root is', farthest.name, 'with dist =', dist)


# The program output is:
#
# The distance between A and C is 0.1011
# The number of nodes between A and D is 9
# The farthest node from E is A with dist = 1.1010011
# The farthest (topologically) node from E is D with 4.0 nodes in between
# The farthest node from root is A with dist = 1.101
